package cn.edu.lcvc.ebuy_2023rj2.dao;

import cn.edu.lcvc.ebuy_2023rj2.model.Admin;
import cn.edu.lcvc.ebuy_2023rj2.model.query.AdminQuery;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 处理admin表的所有数据层的操作，即sql语句
 */
public interface AdminDao {

    /**
     * 根据账户名和密码来找出符合条件的记录数
     * @param username
     * @param password
     * @return  返回记录数
     */
    @Select("SELECT COUNT(1) AS num FROM admin WHERE username = #{username} AND password = #{password}")
    int countByUsernameAndPassword(@Param(value="username") String username, @Param(value="password")String password);

    /**
     *根据账户名在数据库读取指定账户的所有信息
     * @param username
     * @return   null没有找到记录
     */
    @Select("SELECT * FROM admin WHERE username = #{username}")
    Admin getByUsername(@Param(value = "username") String username);


    /**
     * 根据查询条件查询指定的记录，
     * 如果查询字段都为空，则返回所有记录
     * @param adminQuery 查询条件
     * @param offset 第一条记录的索引（从0开始算起）
     * @return length 要显示的记录个数（即从offset开始要显示的记录数）
     */
    List<Admin> find(@Param(value = "admin") AdminQuery adminQuery, @Param(value = "offset")final int offset, @Param(value = "length")final int length);

    /**
     * 根据查询条件返回符合条件的记录数据
     * @param adminQuery
     * @return
     */
 int count (@Param(value = "admin") AdminQuery adminQuery);



    /**
     * 根据id删除指定记录
     * @param id
     * @return  返回成功删除的记录数
     */
    @Delete("DELETE FROM admin WHERE id=#{id}")
    int deleteById( int id);
    int deletes(Integer [] id);

    /**
     * 添加账户
     * @param admin  账户对象
     * @return  添加成功的记录数量
     */

    int save(Admin admin);

    /**
     * 获取账户名重名的数量
     * @param username
     * @return  返回重名的数量
     */
    @Select("SELECT COUNT(1) FROM admin WHERE username=#{username}")
    int countByUsername( String username);

    /**
     * 根据id读取指定账户记录
     * @param id
     * @return  null表示没有找到记录
     */
    @Select("SELECT * FROM admin WHERE id=#{id}")
    Admin getById( int id);


    /**
     * 统计除了指定id之外，还存在几个重名的账户
     * @return
     */
    @Select("SELECT COUNT(1) FROM admin WHERE username=#{username} AND id!=#{id}")
    int countByUsernameAndNotId(@Param(value = "username") String username,@Param(value = "id") Integer id);

    /**
     * 执行账户名编辑
     * @param admin
     * @return  成功编辑的个数
     */
    int update( Admin admin);
}
